package com.by.wx.process.script;

import cn.hutool.core.util.ObjUtil;
import cn.hutool.extra.mail.MailUtil;
import com.by.wx.model.script.CsTask;
import com.by.wx.process.task.TaskProcessServ;
import com.by.wx.redis.RedisManage;
import com.by.wx.utils.CsAirScriptUtils;
import com.by.wx.vo.script.CsFlatsVo;
import com.by.wx.vo.script.CsGenRunVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 南航-脚本-业务层
 * @ClassName CsAirCtrl
 * @Date 2025/1/2
 * @Author Blue
 */
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class CsAirScriptServ {

    private final RedisManage redisManage;
    private final TaskProcessServ taskProcessServ;

    /**
     * 调用生成脚本and运行
     * @return 返回任务id
     */
    public int genRunScr(CsGenRunVo genRunVo) {
        // 构建脚本参数对象
        String str = CsAirScriptUtils.buildMailParams("229588902258", "858536", genRunVo.getDate(), genRunVo.getDeparture(), genRunVo.getArrival());
        // 发送邮件
        MailUtil.send("34945177@qq.com", "触发", str, false);

        // 封装任务数据c
        CsTask csTask = CsAirScriptUtils.buildCsTask(genRunVo);
        log.info("key:{}，任务信息: {}", csTask.key(), csTask);

        // 保存任务对象
        redisManage.set(csTask.key(), csTask);

        return str.hashCode();
    }

    /**
     * 脚本js回调
     * @param flats 航班数据-数组对象
     */
    public void callback(CsFlatsVo[] flats) {
        log.info("脚本js回调，flats:{}", flats.length);
        if (ObjUtil.isEmpty(flats)) {
            return;
        }
        // 保存Redis
        for (CsFlatsVo flat : flats) {
            log.info("flat: {}",flat);
            // 判断key是否存在
            Boolean b = redisManage.hasKey(flat.key());
            if (b) {
                // Redis中的值
                CsFlatsVo csFlatsVo = redisManage.get(flat.key(), CsFlatsVo.class);
                // 比较Redis中的值 跟 脚本回调的值是否 不一致
                if (!csFlatsVo.getSeatCount().equals(flat.getSeatCount())) {
                    // 不一致 更新
                    flat.setUpdate(true);
                    redisManage.set(flat.key(), flat);
                }
            }
            // 新值
            else {
                // 新值第一次推送
                flat.setUpdate(true);
                redisManage.set(flat.key(), flat);
            }
        }
    }

}
